package com.liming.auth.client;

import com.liming.common.pojo.dto.authinfo.AddOrUpdateUserAddressDTO;
import com.liming.common.pojo.dto.authinfo.UserActivityAddDTO;
import com.liming.common.pojo.dto.authinfo.UsernameLoginDTO;
import com.liming.common.pojo.dto.authinfo.mini.UpdateUserInfoDTO;
import com.liming.common.pojo.dto.authinfo.mini.UpdateUserPwdDTO;
import com.liming.common.pojo.vo.authinfo.CaptchaVO;
import com.liming.common.pojo.vo.authinfo.mini.MiniAddressVO;
import com.liming.common.pojo.vo.authinfo.mini.MiniRegionVO;
import com.liming.common.pojo.vo.authinfo.mini.MiniUserInfoVO;
import com.liming.common.pojo.vo.dashboard.UserRegister;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 用户权限（信息）OpenFeign客户端
 *
 * @author liming
 * @date 2025/1/8
 */
@FeignClient(value = "auth-service", contextId = "userAuthClient", path = "/service/user_auth_info")
public interface UserAuthClient {

    /**
     * 横线干扰验证码
     *
     * @return 横线干扰验证码
     */
    @GetMapping(value = "captcha", produces = MediaType.APPLICATION_JSON_VALUE)
    CaptchaVO lineCaptcha();

    /**
     * 用户注册统计
     *
     * @param scope 时间范围
     * @return 用户注册统计
     */
    @GetMapping(value = "register_date_count")
    List<UserRegister> registerDateCount(@RequestParam String scope);

    /**
     * 所有用户行为分数
     *
     * @return Map<用户ID ， 分数>
     */
    @GetMapping(value = "activity_score")
    Map<Long, Double> allUserActivityScore();

    /**
     * 系统用户数量
     *
     * @return 用户数量
     */
    @GetMapping(value = "userCount")
    Long userCount();

    /**
     * 活跃的用户数量 - 时间范围内
     *
     * @param scope 时间范围
     * @return 数量
     */
    @GetMapping(value = "activity_user_count")
    Integer activityUserCount(@RequestParam String scope);

    /**
     * 用户性别数量
     *
     * @return Map<性别 ， 数量>
     */
    @GetMapping("gender_quantity")
    Map<Integer, Long> genderQuantityMap();

    /**
     * 用户ID - 名称 Map
     *
     * @return Map<用户ID ， 用户名称>
     */
    @GetMapping("all_user_id_nickname_map")
    Map<Long, String> userIdsAndNickname();

    /**
     * 用户 Id - 头像 Map
     *
     * @return Map<用户ID ， 用户头像>
     */
    @GetMapping("all_user_id_avatar_map")
    Map<Long, String> userIdsAndAvatar();

    /**
     * 微信小程序一键登录
     *
     * @param code 微信返回的code
     * @return Token
     */
    @GetMapping("login_wx_mini")
    String loginWithWxMini(@RequestParam String code);

    /**
     * 获取用户登录的openid
     *
     * @return openid
     */
    @GetMapping("login_openid")
    String loginOpenid();

    /**
     * 用户登录 - 用户名登录
     *
     * @param usernameLoginDTO 用户名登录参数
     * @return Token
     */
    @PostMapping(value = "login_username", produces = MediaType.APPLICATION_JSON_VALUE)
    String loginWithUsername(@RequestBody UsernameLoginDTO usernameLoginDTO);

    /**
     * 用户登出
     *
     * @return 是否登出成功
     */
    @PostMapping(value = "logout")
    Boolean logout();

    /**
     * 添加 - 用户行为日志
     *
     * @param dto 用户行为数据
     * @return 是否添加成功
     */
    @PostMapping("user_activity")
    Boolean addUserActivity(@RequestBody UserActivityAddDTO dto);

    /**
     * 获取用户 Id - 头像 Map
     *
     * @param userIds 用户ID列表
     * @return Map<用户ID ， 头像>
     */
    @PostMapping("id_avatar_map")
    Map<Long, String> idAndAvatarMap(@RequestBody List<Long> userIds);

    /**
     * 获取用户收货地址
     *
     * @return 用户收货地址
     */
    @GetMapping("address")
    List<MiniAddressVO> addressList();

    /**
     * 用户编辑收货地址时，返回系统中的省市区街道信息
     *
     * @return 省市区街道信息
     */
    @GetMapping("region_map")
    Map<String, List<MiniRegionVO>> miniRegionMap();

    /**
     * 新增|更新 用户收货地址
     *
     * @param addOrUpdateUserAddressDTO 用户收货地址信息
     * @return 是否成功
     */
    @PostMapping("address")
    Boolean addOrUpdateAddress(@RequestBody AddOrUpdateUserAddressDTO addOrUpdateUserAddressDTO);

    /**
     * 删除用户收货地址
     *
     * @param id 地址ID
     * @return 是否删除成功
     */
    @DeleteMapping("address/{id}")
    Boolean deleteAddress(@PathVariable Long id);

    /**
     * 根据用户地址ID,查询 联系人姓名/手机号/地址
     *
     * @param userAddressIds 用户地址ID列表
     * @return Map<用户地址ID, ( 联系人姓名 / 手机号 / 地址 )>
     */
    @PostMapping("address/info")
    Map<Long, String> addressInfoByIds(@RequestBody List<Long> userAddressIds);

    /**
     * 商品ID - 活动类型列表 Map
     *
     * @return Map
     */
    @GetMapping("product/activity_type_list_map")
    Map<Long, List<Integer>> productIdActivityTypeListMap();

    /**
     * 获取用户行为的品牌和分类 Map
     *
     * @param userId 用户ID
     * @param code   行为Code
     * @return Map
     */
    @GetMapping("product/activity_brand_category_list_map/{userId}/{code}")
    Map<Integer, List<Long>> activityBrandAndCategoryListMap(@PathVariable Long userId, @PathVariable Integer code);


    /**
     * 小程序 - 用户信息
     *
     * @return 用户信息
     */
    @GetMapping("info")
    MiniUserInfoVO info();

    /**
     * 小程序 - 更新用户信息
     *
     * @param updateUserInfoDTO 更新用户信息
     * @return 更新是否成功
     */
    @PutMapping("info")
    Boolean updateInfo(@RequestBody UpdateUserInfoDTO updateUserInfoDTO);

    /**
     * 小程序 - 更新用户密码
     *
     * @param updateUserPwdDTO 更新用户密码
     * @return 是否更新成功
     */
    @PutMapping("password")
    Boolean updatePassword(@RequestBody UpdateUserPwdDTO updateUserPwdDTO);
}
